package orcamento;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.component.UIData;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import javax.naming.NamingException;

import material.EntidadeMaterial;
import material.Material;

import servico.EntidadeServico;
import servico.Servico;
import usuario.EntidadeCliente;
import usuario.Usuario;
import util.ServiceLocator;

public class Orcamentos implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@PostConstruct
	public void iniciar() {
		System.out.println("O Bean Cadastro Funcionario Foi Iniciado");
	}

	@PreDestroy
	public void encerrar() {
		System.out.println("O Bean Cadastro Funcionario foi Encerrado");
	}

	private EntidadeOrcamento orcamento = new EntidadeOrcamento();
	private EntidadeMaterial material = new EntidadeMaterial();
	private EntidadeServico servico = new EntidadeServico();
	private EntidadeCliente cliente_orc = new EntidadeCliente();

	private Item_orc_serv item = new Item_orc_serv();
	private Item_orc_mat item_mat = new Item_orc_mat();
	private UIData lista = new UIData();
	private UIData listamat = new UIData();

	private List<EntidadeServico> serv = new ArrayList<EntidadeServico>();
	private List<EntidadeMaterial> mat = new ArrayList<EntidadeMaterial>();
	private List<EntidadeCliente> clientes = new ArrayList<EntidadeCliente>();
	private List<Item_orc_serv> servicos = new ArrayList<Item_orc_serv>();
	private List<Item_orc_mat> materiais = new ArrayList<Item_orc_mat>();

	private String sel_mat = new String();
	private String sel_serv = new String();
	private String nome_busca = new String();
	private String cliente = new String();

	private int mat_quant;
	private int serv_quant;
	
	
	public List<Item_orc_serv> getServicos() throws NamingException {
		Orcamento orca = (Orcamento) ServiceLocator
				.getService("orcamentoBean/remote");
		servicos = orca.getServico();
		return servicos;
	}

	public void setServicos(List<Item_orc_serv> servicos) {
		this.servicos = servicos;
	}

	public List<Item_orc_mat> getMateriais() throws NamingException {
		Orcamento orca = (Orcamento) ServiceLocator
				.getService("orcamentoBean/remote");
		materiais = orca.getMaterial();
		return materiais;
	}

	public void setMateriais(List<Item_orc_mat> materiais) {
		this.materiais = materiais;
	}

	public EntidadeCliente getCliente_orc() {
		return cliente_orc;
	}

	public void setCliente_orc(EntidadeCliente cliente_orc) {
		this.cliente_orc = cliente_orc;
	}

	public String getCliente() {
		return cliente;
	}

	public void setCliente(String cliente) {
		this.cliente = cliente;
	}

	public List<SelectItem> getClientes() {
		
		List<SelectItem> lista = new ArrayList<SelectItem>();
		for(int i = 0; clientes.size() > i; i++)
		{
			SelectItem item = new SelectItem(clientes.get(i).getCodigo(), clientes.get(i).getNome());
			lista.add(item);
		}
		return lista;
	}

	public void setClientes(List<EntidadeCliente> clientes) {
		this.clientes = clientes;
	}

	public String getNome_busca() {
		return nome_busca;
	}

	public void setNome_busca(String nome_busca) {
		this.nome_busca = nome_busca;
	}

	public UIData getListamat() {
		return listamat;
	}

	public void setListamat(UIData listamat) {
		this.listamat = listamat;
	}

	public int getServ_quant() {
		return serv_quant;
	}

	public void setServ_quant(int serv_quant) {
		this.serv_quant = serv_quant;
	}

	public int getMat_quant() {
		return mat_quant;
	}

	public void setMat_quant(int mat_quant) {
		this.mat_quant = mat_quant;
	}

	public EntidadeMaterial getMaterial() {
		return material;
	}

	public void setMaterial(EntidadeMaterial material) {
		this.material = material;
	}

	public EntidadeServico getServico() {
		return servico;
	}

	public void setServico(EntidadeServico servico) {
		this.servico = servico;
	}

	public String getSel_mat() {
		return sel_mat;
	}

	public void setSel_mat(String sel_mat) {
		this.sel_mat = sel_mat;
	}

	public String getSel_serv() {
		return sel_serv;
	}

	public void setSel_serv(String sel_serv) {
		this.sel_serv = sel_serv;
	}

	public List<SelectItem> getServ() throws NamingException {
		Servico servi = (Servico) ServiceLocator
				.getService("servicoBean/remote");

		serv = servi.buscaServico();
		List<SelectItem> lista = new ArrayList<SelectItem>();
		SelectItem item_zero = new SelectItem("Selecione");
		lista.add(item_zero);
		for (int i = 0; serv.size() > i; i++) {
			SelectItem item = new SelectItem(serv.get(i).getCodigo(), serv.get(
					i).getNome());
			lista.add(item);
		}
		return lista;
	}

	public void setServ(List<EntidadeServico> serv) {
		this.serv = serv;
	}

	public List<SelectItem> getMat() throws NamingException {
		Material mate = (Material) ServiceLocator
				.getService("materialBean/remote");

		List<SelectItem> lista = new ArrayList<SelectItem>();
		mat = mate.buscaMaterial();
		SelectItem item_zero = new SelectItem("Selecione");
		lista.add(item_zero);
		for (int i = 0; mat.size() > i; i++) {
			SelectItem item = new SelectItem(mat.get(i).getCodigo(), mat.get(i)
					.getNome());
			lista.add(item);
		}
		return lista;
	}

	public void setMat(List<EntidadeMaterial> mat) {
		this.mat = mat;
	}

	public UIData getLista() {
		return lista;
	}

	public void setLista(UIData lista) {
		this.lista = lista;
	}

	public EntidadeOrcamento getOrcamento() {
		return orcamento;
	}

	public void setOrcamento(EntidadeOrcamento orcamento) {
		this.orcamento = orcamento;
	}

	public Item_orc_serv getItem() {
		return item;
	}

	public void setItem(Item_orc_serv item) {
		this.item = item;
	}

	public String enviar() throws NamingException {
		Orcamento orca = (Orcamento) ServiceLocator
				.getService("orcamentoBean/remote");
		
		orca.setUser(getCliente_orc());
		orca.orcamento(getOrcamento());
		setOrcamento(null);
		setItem(null);
		setMaterial(null);
		setServico(null);
		setCliente_orc(null);
		setCliente(null);
		setClientes(null);

		Map<String, Object> requestMap = FacesContext.getCurrentInstance()
				.getExternalContext().getRequestMap();

		requestMap.put("resultado", orca);
		return null;

	}

	public String incluir() throws NamingException {
		float total;

		List<Integer> lista = new ArrayList<Integer>();

		Orcamento orca = (Orcamento) ServiceLocator
				.getService("orcamentoBean/remote");

		Material mate = (Material) ServiceLocator
				.getService("materialBean/remote");

		Servico servi = (Servico) ServiceLocator
				.getService("servicoBean/remote");

		item.setDesc_item(getServico().getNome());
		item.setVlr_item(getServico().getValor() * getServ_quant());
		item.setCod_item(getServico().getCodigo());

//		orcamento.setListserv(orca.incluirServ(getItem()));
		orca.incluirServ(getItem());
		
		total = orcamento.getTotal() + item.getVlr_item();
		orcamento.setTotal(total);

		lista = servi.getMats(getServico().getCodigo());

		for (int i = 0; lista.size() > i; i++) {
			setMaterial(mate.buscaMaterial_id(lista.get(i)));
			item_mat.setVlr_item(getMaterial().getValor_unit()* getServ_quant());
			item_mat.setDesc_item(getMaterial().getNome());
			item_mat.setCod_item(getMaterial().getCodigo());
			item_mat.setServico(getServico().getCodigo());
			item_mat.setBtn_del(false);
			
//			orcamento.setListmat(orca.incluirMat(item_mat));
			orca.incluirMat(item_mat);

			
			total = orcamento.getTotal() + item_mat.getVlr_item();
			orcamento.setTotal(total);
			setMaterial(null);
		}
		item_mat.setServico(0);
		return null;

	}

	public String del_item() throws NamingException {
		Orcamento orca = (Orcamento) ServiceLocator
				.getService("orcamentoBean/remote");
		
		Item_orc_serv s = new Item_orc_serv();

		float total;
		
		s = orca.ListaServico(lista.getRowIndex());
		
		for (int i = 0; materiais.size() > i; i++) {
			if (materiais.get(i).getServico() == s.getCod_item()) {
				total = orcamento.getTotal() - orca.valor_mat(i);
				orcamento.setTotal(total);
//				orcamento.setListmat(orca.del_lista_mat(i)); nao ta deletando mexer aki
				orca.del_lista_mat(i);
			}

		}

		total = orcamento.getTotal() - orca.valor_serv(lista.getRowIndex());
		orcamento.setTotal(total);
//		orcamento.setListserv(orca.del_lista_serv(lista.getRowIndex()));
		orca.del_lista_serv(lista.getRowIndex());

		orcamento.getListmat();

		return "lista";
	}

	public void preenche_mat(ValueChangeEvent event) throws NamingException {
		String valor = (String) event.getNewValue();

		Material mate = (Material) ServiceLocator
				.getService("materialBean/remote");

		setMaterial(mate.buscaMaterial_id(Integer.parseInt(valor)));
	}

	public String incluir_mat() throws NamingException {
		float total;

		Orcamento orca = (Orcamento) ServiceLocator
				.getService("orcamentoBean/remote");

		item_mat.setVlr_item(getMaterial().getValor_unit() * getMat_quant());
		item_mat.setDesc_item(getMaterial().getNome());
		item_mat.setCod_item(getMaterial().getCodigo());
		item_mat.setBtn_del(true);

//		orcamento.setListmat(orca.incluirMat(item_mat));
		orca.incluirMat(item_mat);
		
		total = orcamento.getTotal() + item_mat.getVlr_item();
		orcamento.setTotal(total);

		return null;

	}

	public void preenche_serv(ValueChangeEvent event) throws NamingException {

		String valor = (String) event.getNewValue();

		Servico servi = (Servico) ServiceLocator
				.getService("servicoBean/remote");

		setServico(servi.buscaServCod(Integer.parseInt(valor)));
	}

	public void del_mat() throws NamingException {
		Orcamento orca = (Orcamento) ServiceLocator
				.getService("orcamentoBean/remote");

		float total;
		total = orcamento.getTotal() - orca.valor_mat(listamat.getRowIndex());
		orcamento.setTotal(total);
//		orcamento.setListmat(orca.del_lista_mat(listamat.getRowIndex()));
		orca.del_lista_mat(listamat.getRowIndex());
	}
	public void busca_cliente() throws NamingException
	{
		Usuario cli = (Usuario) ServiceLocator
		.getService("usuarioBean/remote");
		
		clientes = cli.nome_cli(getNome_busca());
		getClientes();
	}
	
	public void seleciona_nome() throws NamingException
	{
		Usuario cli = (Usuario) ServiceLocator
		.getService("usuarioBean/remote");
		
		
		setCliente_orc(cli.busca_cliente(Integer.parseInt(getCliente())));
		orcamento.setCliente(getCliente_orc());
	}
}
